问题:
1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。
2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。
1. 解法:
先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。
#include <iostream>
#include <algorithm>
using namespace std;
struct Line
{
int low, high;
bool operator<(const Line &l) const
{return low<l.low;}
};
#define MAXN 10001
Line lines[MAXN]; // 目标区间
int ncnt = 0; // 合并后区间的个数
#define N 101
Line sl[N]; // 待查询的源区间
// 用二分查找找出key所在的区间,以区间的low作为划分
int GetIndex(int key)
{
int u, v;
u = 0; v = ncnt-1;
while (u<=v) // u,v可取等号
{
int m = (u+v)>>1;
if (key >= lines[m].low)
u = m+1;
else
v = m-1;
}
return v;
}
int main()
{
int n, k, i, j;
cin >> n >> k; // n是目标区间的个数,k是待查询的源区间的个数
for (i=0; i<n; i++)
cin >> lines[i].low >> lines[i].high;
for (i=0; i<k; i++)
cin >> sl[i].low >> sl[i].high;
// 排序O(nlogn)
sort(lines, lines+n);
// 合并O(n)
int